<template>
  <div>
    <!--通过state获取共享数据sum-->
    <h1>当前求和为：{{he}}</h1>
    <h3>当前求和放大10倍为：{{bigSum}}</h3>
    <h3>我在{{xuexiao}}学习{{xueke}}（对象写法）</h3>
    <select v-model.number="n"> <!--.number表示将输入转为数字类型接收-->
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
    </select>
    <button @click="increment(n)">+</button>
    <button @click="decrement(n)">-</button>
    <button @click="incrementOdd(n)">当前求和为奇数再加</button>
    <button @click="incrementWait(n)">等一等再加</button>
  </div>
</template>

<script>
//引入vuex的mapState，mapGetters
import {mapState, mapGetters} from 'vuex'
//引入vuex的mapActions，mapMutations
import {mapActions, mapMutations} from 'vuex'
export default {
    name: 'Count',
    data() {
        return {
            //sum: 0, //当前和，已交给vuex管理
            n: 1, //用户选的数字
        }
    },
    computed: {
       //1.对象写法：调用mapState生成一个映射对象，通过解构赋值扩展运算符放到计算属性中，相当于写上面的代码
       ...mapState({
            he: 'sum',
            xuexiao: 'school',
            xueke: 'subject',
        }),
        //1.对象写法：mapGetters和mapState用法完全一样，区别只是从getters中获取数据作为计算属性
        ...mapGetters({
            bigSum: 'bigSum',
        })
    },
    methods: {
        /*
        increment(val) {
            this.$store.commit('JIA', val)
        },
        decrement(val) {
            this.$store.commit('JIAN', val)
        },
        */
        //1.对象写法 mapMutations用于将mutations中的操作映射为组件内的methods，下面写法相当于上面的代码
        ...mapMutations({
            increment: 'JIA', //k为映射后的方法名，v为mutations的操作名，注意@click调用时要传参val
            decrement: 'JIAN',
        }),

        /*
        incrementOdd(val) {
            this.$store.dispatch('jiaOdd', val)
        },
        incrementWait() {
            this.$store.dispatch('jiaWait', val)
        },
        */

        //1.对象写法 mapActions用于将actions中的操作映射为组件内的methods，下面写法相当于上面的代码
        ...mapActions({
            incrementOdd: 'jiaOdd',
            incrementWait: 'jiaWait',
        })
    },
    mounted() {

    }
}
</script>

<style scoped>
    button {
        margin-left: 5px;
        margin-right: 5px;
    }
</style>